{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 位置编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 10, 64)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6wAAAKsCAYAAADoTDDwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABF6klEQVR4nO3de3hV9Z0v/k8SIAElXEQIKAhejooXtCAU7bRa8his49FzHCs9tCJanCrUKr0ov0dBpYK3cajKI7X1eo5Ua091rK0ogwVPRwTFMq2OpVJRUQl4g0jUgMn+/dHHPZNycS0wKyvJ6/U8+9G99md/8917SeST92evlBQKhUIAAABAzpS29gYAAABgezSsAAAA5JKGFQAAgFzSsAIAAJBLGlYAAAByScMKAABALmlYAQAAyCUNKwAAALmkYQUAACCXNKwAAADkUptoWOfOnRuDBw+OioqKGDVqVCxfvry1twQAAJBLTz75ZJxyyikxYMCAKCkpiYceeuhTn7N48eL43Oc+F+Xl5XHggQfGXXfdtU1Na/RluW9Y77///pg6dWrMmDEjnnvuuRg2bFjU1NTEhg0bWntrAAAAuVNfXx/Dhg2LuXPnJqpfs2ZNnHzyyXHCCSfEypUr46KLLopvfvOb8dhjjxVrWqsvKykUCoUW/Qq7adSoUXHMMcfELbfcEhERTU1NMXDgwPj2t78dl156aSvvDgAAIL9KSkriwQcfjNNOO22HNZdcckn8+te/jueff754bNy4cbFx48ZYsGBBRLReX9apxVb+DGzZsiVWrFgR06ZNKx4rLS2N6urqWLp06Xaf09DQEA0NDcX7TU1N8e6778Zee+0VJSUlLb5nAABgxwqFQrz//vsxYMCAKC3N/cBnMx999FFs2bKlVb52oVDYpp8pLy+P8vLy3V576dKlUV1d3exYTU1NXHTRRRGxa33ZZyXXDevbb78djY2N0a9fv2bH+/XrF3/605+2+5zZs2fHlVdemcX2AACAXbR27drYd999W3sbiX300UcxZMiQqK2tbZWvv+eee8bmzZubHZsxY0ZcccUVu712bW3tdnuuurq6+PDDD+O9995L3Zd9VnLdsO6KadOmxdSpU4v3N23aFIMGDYqLL7448U8f/utPDj7N7NmzU+8vD2unXb8l1067fltdO+363vPdXzvt+t7z3V877fre891fO+363vPdXzvt+t7z3V877fre891fO+36adauq6uLgQMHRvfu3VPtp7Vt2bIlamtrY+3atVFZWZnp1/7kPfvbr/1ZpKt5l+uGtU+fPlFWVhbr169vdnz9+vVRVVW13efsKBZPE5en+Q8w7X8keVk77fotuXba9dvq2mnX957v/tpp1/ee7/7aadf3nu/+2mnX957v/tpp1/ee7/7aadf3nu/+2mnX35UGrq1+XK979+6ZN9ufXHaosrKyRZrlqqqq7fZclZWV0bVr1ygrK0vdl31Wcj003qVLlxg+fHgsWrSoeKypqSkWLVoUo0ePbsWdAQAAtA+jR49u1nNFRCxcuLDYc7VmX5brhDUiYurUqTFhwoQYMWJEjBw5MubMmRP19fUxceLE1t4aAABA7mzevDlWr15dvL9mzZpYuXJl9O7dOwYNGhTTpk2LN954I+65556IiPjWt74Vt9xyS/zgBz+Ic845J5544on4+c9/Hr/+9a+La7RWX5b7hvXMM8+Mt956K6ZPnx61tbVx1FFHxYIFC7b5wC8AAEBLKxQKkfVvBk379Z599tk44YQTivc/ucbPhAkT4q677op169bFa6+9Vnx8yJAh8etf/zouvvji+NGPfhT77rtv/PSnP42amppiTWv1ZblvWCMipkyZElOmTGntbQAAAOTe8ccfv9Mm96677truc37/+9/vdN3W6MvaRMMKAACQB20hYW1Pcn3RJQAAADouCSsAAEBCEtZsSVgBAADIJQ0rAAAAuWQkGAAAICEjwdmSsAIAAJBLElYAAICEJKzZkrACAACQSxpWAAAAcslIMAAAQEJGgrMlYQUAACCXJKwAAAAJSVizJWEFAAAglySsAAAACUlYsyVhBQAAIJc0rAAAAOSSkWAAAICEjARnS8IKAABALklYAQAAEpKwZkvCCgAAQC5pWAEAAMglI8EAAAAJGQnOloQVAACAXJKwAgAAJCRhzZaEFQAAgFySsAIAACQkYc2WhBUAAIBc0rACAACQS0aCAQAAEjISnC0JKwAAALkkYQUAAEhIwpotCSsAAAC5pGEFAAAgl4wEAwAAJGQkOFsSVgAAAHJJwgoAAJCQhDVbElYAAAByScIKAACQQkdOPLMmYQUAACCXNKwAAADkkpFgAACAhFx0KVsSVgAAAHJJwgoAAJCQhDVbElYAAAByScMKAABALhkJBgAA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IFXD+vLLL8fvf//7xPUjR45MvSEAAACISNmwlpSUtNQ+AAAAcs9IcLZcdAkAAIBcctElAACAhCSs2ZKwAgAAkEupEtb6+vo455xzEtW2xk8eAAAAaD9SNayPPvpobN26NXF9165dU28IAAAgr4wEZytVw7ps2bJ4//33E9f37ds3Bg0alHpTAAAAkOozrFdffXVUVFREeXl5otusWbNaat8AAACZ+yRhzfrWUaVKWDt37hxnnXVW4vpbbrkl9YYAAAAgImXDWlJSkmrxtPUAAAB55jOs2fJrbQAAANqhuXPnxuDBg6OioiJGjRoVy5cv32n9Aw88EIccckhUVFTEEUccEb/5zW+aPV4oFGL69OnRv3//6Nq1a1RXV8dLL73Uki9BwwoAANDe3H///TF16tSYMWNGPPfcczFs2LCoqamJDRs2bLf+qaeeiq997Wtx7rnnxu9///s47bTT4rTTTovnn3++WHPdddfFTTfdFPPmzYtly5bFHnvsETU1NfHRRx+12OtINRK8devWePLJJxPV5u3DwevWrUs8opzmYlE33XRTqn3svffeiWufeuqpVGu/+OKLqerffffdxLUrVqxItXbnzp1T1f/pT39KXHvaaaelWvvpp59OXDtixIhUa7/zzjup6isrKxPXfvDBB6nW3nPPPVPVt+SvqGpsbExcW15enmrtpqamVPVdunRJXJv2e1anTqm+haZSVlbWYmuXlrbszypb8uMgbXXtluZ9AchWa/U5dXV1ze5/crHb7bnxxhtj0qRJMXHixIiImDdvXvz617+OO+64Iy699NJt6n/0ox/F2LFj4/vf/35ERMycOTMWLlwYt9xyS8ybNy8KhULMmTMnLrvssjj11FMjIuKee+6Jfv36xUMPPRTjxo37LF9qUaq/bX3jG9+IRx99NHH92WefnXY/AAAAbMfAgQOb3Z8xY0ZcccUV29Rt2bIlVqxYEdOmTSseKy0tjerq6li6dOl21166dGlMnTq12bGampp46KGHIiJizZo1UVtbG9XV1cXHe/ToEaNGjYqlS5fmo2G9+OKLU/00oaV/ig8AAJCl1rzo0tq1a5tN7O0oXX377bejsbEx+vXr1+x4v379djjZWFtbu9362tra4uOfHNtRTUtI1bAedthhse+++yaqLRQK8cEHH8SyZct2aWMAAAD8p8rKylQfMWsPUjWse+yxRzzxxBOJ64855pjUGwIAAGDX9enTJ8rKymL9+vXNjq9fvz6qqqq2+5yqqqqd1n/yz/Xr10f//v2b1Rx11FGf4e6bSzWz6/ewAgAAHdknI8FZ39Lo0qVLDB8+PBYtWlQ81tTUFIsWLYrRo0dv9zmjR49uVh8RsXDhwmL9kCFDoqqqqllNXV1dLFu2bIdrfhZa7hKXAAAAtIqpU6fGhAkTYsSIETFy5MiYM2dO1NfXF68afNZZZ8U+++wTs2fPjoiI73znO/GlL30p/umf/ilOPvnkuO++++LZZ5+N2267LSL+GkZedNFF8cMf/jAOOuigGDJkSFx++eUxYMCA1L/FIw0NKwAAQEKtedGlNM4888x46623Yvr06VFbWxtHHXVULFiwoHjRpNdee63ZRXKPPfbYmD9/flx22WXx//1//18cdNBB8dBDD8Xhhx9erPnBD34Q9fX1cd5558XGjRvjC1/4QixYsCAqKip2/0XugIYVAACgHZoyZUpMmTJlu48tXrx4m2NnnHFGnHHGGTtcr6SkJK666qq46qqrPqstfqpUDWuXLl3i2GOPTVzfp0+f1BsCAADIq7aSsLYXqRrWkSNHxltvvZW4/sADD0y9IQAAAIhI2bA++eST8fDDDyfu8M8444yYOXPmLm0MAACAji1Vw1pSUhKDBg1KXN+Ro2sAAKD9MRKcLb+HFQAAgFxylWAAAICEJKzZSpWwAgAAQFZSJawffvhh4t+505F/CgAAAMDuS9Ww/vjHP44PP/wwcX1NTU3qDQEAAOSVkeBspWpYv/jFL7bUPgAAAKAZF10CAABISMKaLRddAgAAIJckrAAAAAlJWLMlYQUAACCXNKwAAADkkpFgAACAhIwEZ0vCCgAAQC5JWAEAABKSsGZLwgoAAEAuaVgBAADIJSPBAAAACRkJzpaEFQAAgFySsAIAACQkYc2WhBUAAIBckrACAAAkJGHNloQVAACAXNKwAgAAkEtGggEAABIyEpwtCSsAAAC5JGEFAABISMKaLQkrAAAAuaRhBQAAIJeMBAMAACRkJDhbElYAAAByScIKAACQQkdOPLMmYQUAACCXJKwAAAAJ+QxrtiSsAAAA5JKGFQAAgFwyEgwAAJCQkeBsSVgBAADIJQkrAABAQhLWbElYAQAAyCUNKwAAALlkJBgAACAhI8HZkrACAACQSxJWAACAhCSs2ZKwAgAAkEsSVgAAgIQkrNnKfcL6xhtvxNe//vXYa6+9omvXrnHEEUfEs88+29rbAgAAoIXlOmF977334rjjjosTTjghHn300dh7773jpZdeil69erX21gAAAGhhuW5Yr7322hg4cGDceeedxWNDhgzZ6XMaGhqioaGheL+urq7F9gcAAHQsRoKzleuG9eGHH46ampo444wzYsmSJbHPPvvEBRdcEJMmTdrhc2bPnh1XXnnlNsf/4R/+ITp37pzo65555pmJ93jWWWclro2IOPfccxPXLliwINXajY2NqepXr16duHbVqlWp1t6yZUuq+j/96U+JaysqKlKtvXbt2sS1J5xwQqq1//znP6eqHzRoUOLazZs3p1q7W7duqer/6w92Pk3Xrl1Trf3xxx8nru3SpUuqtZuamlLVJ/1zvytrd+qU7ltomv/ZlJWV5WbttEpLW+7TJi25dklJSZtcuy3zvmyf9wXgP+X6M6wvv/xy3HrrrXHQQQfFY489Fueff35ceOGFcffdd+/wOdOmTYtNmzYVb2maFQAAgJ35JGHN+tZR5TphbWpqihEjRsSsWbMiIuLoo4+O559/PubNmxcTJkzY7nPKy8ujvLw8y20CAADQAnKdsPbv3z+GDh3a7Nihhx4ar732WivtCAAAgKzkOmE97rjjtvns5J///OfYb7/9WmlHAABAR+aiS9nKdcJ68cUXx9NPPx2zZs2K1atXx/z58+O2226LyZMnt/bWAAAAaGG5TliPOeaYePDBB2PatGlx1VVXxZAhQ2LOnDkxfvz41t4aAADQAUlYs5XrhjUi4u///u/j7//+71t7GwAAAGQs1yPBAAAAdFy5T1gBAADywkhwtiSsAAAA5JKEFQAAICEJa7YkrAAAAOSShBUAACAhCWu2JKwAAAAd1Lvvvhvjx4+PysrK6NmzZ5x77rmxefPmndZ/+9vfjoMPPji6du0agwYNigsvvDA2bdrUrK6kpGSb23333Zd6fxJWAACADmr8+PGxbt26WLhwYWzdujUmTpwY5513XsyfP3+79W+++Wa8+eabccMNN8TQoUPj1VdfjW9961vx5ptvxi9+8YtmtXfeeWeMHTu2eL9nz56p96dhBQAASKg9jQS/+OKLsWDBgnjmmWdixIgRERFx8803x1e+8pW44YYbYsCAAds85/DDD4//+3//b/H+AQccEFdffXV8/etfj48//jg6dfrPFrNnz55RVVW1W3s0EgwAANAG1NXVNbs1NDTs1npLly6Nnj17FpvViIjq6uooLS2NZcuWJV5n06ZNUVlZ2axZjYiYPHly9OnTJ0aOHBl33HHHLjXeElYAAICEWjNhHThwYLPjM2bMiCuuuGKX162trY2+ffs2O9apU6fo3bt31NbWJlrj7bffjpkzZ8Z5553X7PhVV10VX/7yl6Nbt27x+OOPxwUXXBCbN2+OCy+8MNUeNawAAABtwNq1a6OysrJ4v7y8fLt1l156aVx77bU7XevFF1/c7f3U1dXFySefHEOHDt2mcb788suL/3700UdHfX19XH/99RpWAACA9qiysrJZw7oj3/3ud+Pss8/eac3+++8fVVVVsWHDhmbHP/7443j33Xc/9bOn77//fowdOza6d+8eDz74YHTu3Hmn9aNGjYqZM2dGQ0PDDhvt7dGwAgAAJNQWLrq09957x9577/2pdaNHj46NGzfGihUrYvjw4RER8cQTT0RTU1OMGjVqh8+rq6uLmpqaKC8vj4cffjgqKio+9WutXLkyevXqlapZjdCwAgAAdEiHHnpojB07NiZNmhTz5s2LrVu3xpQpU2LcuHHFKwS/8cYbMWbMmLjnnnti5MiRUVdXFyeeeGJ88MEH8X/+z/8pXgAq4q+NcllZWfzqV7+K9evXx+c///moqKiIhQsXxqxZs+J73/te6j1qWAEAABJqCwlrGvfee29MmTIlxowZE6WlpXH66afHTTfdVHx869atsWrVqvjggw8iIuK5554rXkH4wAMPbLbWmjVrYvDgwdG5c+eYO3duXHzxxVEoFOLAAw+MG2+8MSZNmpR6fxpWAACADqp3794xf/78HT4+ePDgZg3z8ccf/6kN9NixY2Ps2LGfyf40rAAAAClknbB2ZKWtvQEAAADYHg0rAAAAuWQkGAAAIKH2dtGlvJOwAgAAkEsSVgAAgIQkrNmSsAIAAJBLGlYAAAByyUgwAABAQkaCsyVhBQAAIJckrAAAAAlJWLMlYQUAACCXJKwAAAAJSVizJWEFAAAglzSsAAAA5JKRYAAAgISMBGdLwgoAAEAuSVgBAAASkrBmS8IKAABALmlYAQAAyCUjwQAAAAkZCc6WhBUAAIBckrACAAAkJGHNloQVAACAXJKwAgAAJCRhzZaEFQAAgFzSsAIAAJBLRoIBAAASMhKcLQkrAAAAuSRhBQAASEjCmi0JKwAAALmkYQUAACCXjAQDAAAkZCQ4WxJWAAAAcknCCgAAkJCENVsSVgAAAHJJwgoAAJCQhDVbHaZhvfjii2PPPfdMVPvmm28mXrdHjx6p9vGNb3wjce0555yTau0DDjggVf1zzz2XuPatt95KtfY777yTqn716tWJa0tKSlKt/eqrryau7dq1a6q1074vhx56aOLaN954I9Xae+yxR6r6jz76KHFtRUVFqrW3bt2auLa8vDzV2k1NTanqO3funLg27f8MOnVK9y00zfplZWWp1k6jtLRlh2tacv20f/47wtotvX5L751sOZ9AW2MkGAAAgFzqMAkrAADA7jISnC0JKwAAALkkYQUAAEhIwpotCSsAAAC5pGEFAAAgl4wEAwAAJGQkOFsSVgAAAHJJwgoAAJBCR048syZhBQAAIJckrAAAAAn5DGu2JKwAAADkkoYVAACAXDISDAAAkJCR4GxJWAEAAMglCSsAAEBCEtZsSVgBAADIJQ0rAAAAuWQkGAAAICEjwdmSsAIAAJBLElYAAICEJKzZkrACAACQSxpWAAAAcslIMAAAQEJGgrMlYQUAACCXJKwAAAAJSVizJWEFAAAglySsAAAACUlYsyVhBQAA6KDefffdGD9+fFRWVkbPnj3j3HPPjc2bN+/0Occff3yUlJQ0u33rW99qVvPaa6/FySefHN26dYu+ffvG97///fj4449T70/CCgAA0EGNHz8+1q1bFwsXLoytW7fGxIkT47zzzov58+fv9HmTJk2Kq666qni/W7duxX9vbGyMk08+OaqqquKpp56KdevWxVlnnRWdO3eOWbNmpdqfhhUAACCh9jQS/OKLL8aCBQvimWeeiREjRkRExM033xxf+cpX4oYbbogBAwbs8LndunWLqqqq7T72+OOPx3/8x3/Ev/7rv0a/fv3iqKOOipkzZ8Yll1wSV1xxRXTp0iXxHo0EAwAAtAF1dXXNbg0NDbu13tKlS6Nnz57FZjUiorq6OkpLS2PZsmU7fe69994bffr0icMPPzymTZsWH3zwQbN1jzjiiOjXr1/xWE1NTdTV1cULL7yQao8SVgAAgIRaM2EdOHBgs+MzZsyIK664YpfXra2tjb59+zY71qlTp+jdu3fU1tbu8Hn/63/9r9hvv/1iwIAB8Yc//CEuueSSWLVqVfzyl78srvtfm9WIKN7f2brbo2EFAABoA9auXRuVlZXF++Xl5dutu/TSS+Paa6/d6VovvvjiLu/jvPPOK/77EUccEf37948xY8bEX/7ylzjggAN2ed3t0bACAAC0AZWVlc0a1h357ne/G2efffZOa/bff/+oqqqKDRs2NDv+8ccfx7vvvrvDz6duz6hRoyIiYvXq1XHAAQdEVVVVLF++vFnN+vXrIyJSrRuhYQUAAEisLVx0ae+994699977U+tGjx4dGzdujBUrVsTw4cMjIuKJJ56IpqamYhOaxMqVKyMion///sV1r7766tiwYUNx5HjhwoVRWVkZQ4cOTfVaXHQJAACgAzr00ENj7NixMWnSpFi+fHn827/9W0yZMiXGjRtXvELwG2+8EYccckgxMf3LX/4SM2fOjBUrVsQrr7wSDz/8cJx11lnxxS9+MY488siIiDjxxBNj6NCh8Y1vfCP+/d//PR577LG47LLLYvLkyTscY94RCSsAAEBCbSFhTePee++NKVOmxJgxY6K0tDROP/30uOmmm4qPb926NVatWlW8CnCXLl3iX//1X2POnDlRX18fAwcOjNNPPz0uu+yy4nPKysrikUceifPPPz9Gjx4de+yxR0yYMKHZ721NSsMKAADQQfXu3Tvmz5+/w8cHDx7crGEeOHBgLFmy5FPX3W+//eI3v/nNbu9PwwoAAJBQe0tY885nWAEAAMglDSsAAAC5ZCQYAAAgISPB2ZKwAgAAkEsSVgAAgIQkrNmSsAIAAJBLGlYAAAByyUgwAABAQkaCsyVhBQAAIJckrAAAAAlJWLMlYQUAACCXJKwAAAApdOTEM2sSVgAAAHJJwwoAAEAuGQkGAABIyEWXsiVhBQAAIJckrAAAAAlJWLOV64S1sbExLr/88hgyZEh07do1DjjggJg5c2aHPmEAAAAdRa4T1muvvTZuvfXWuPvuu+Owww6LZ599NiZOnBg9evSICy+8sLW3BwAAQAvKdcP61FNPxamnnhonn3xyREQMHjw4fvazn8Xy5ctbeWcAAEBHZCQ4W7keCT722GNj0aJF8ec//zkiIv793/89fve738VJJ520w+c0NDREXV1dsxsAAABtT64T1ksvvTTq6urikEMOibKysmhsbIyrr746xo8fv8PnzJ49O6688sptjh966KFRWVmZ6OumGTf+JP1NavTo0YlrX3755VRrn3vuuanq0yTVJSUlqdZeu3ZtqvrXX389ce2WLVtabC+dO3dOtfaGDRtS1Xfr1i1xbdoftgwaNChV/Ycffpi4tqKiItXaW7duTVxbXl6eau3GxsZU9WnOaVNTU6q1O3VK9y00zU9Hy8rKWmzt0tJ0P6tM+1PdtOunkfZ7UUdYm+3zngMtRcKarVwnrD//+c/j3nvvjfnz58dzzz0Xd999d9xwww1x99137/A506ZNi02bNhVvaRsnAAAA8iHXCev3v//9uPTSS2PcuHEREXHEEUfEq6++GrNnz44JEyZs9znl5eWpExsAAIAkJKzZynXC+sEHH2wzWlZWVpZ6bA8AAIC2J9cJ6ymnnBJXX311DBo0KA477LD4/e9/HzfeeGOcc845rb01AAAAWliuG9abb745Lr/88rjgggtiw4YNMWDAgPjHf/zHmD59emtvDQAA6ICMBGcr1w1r9+7dY86cOTFnzpzW3goAAAAZy3XDCgAAkCcS1mzl+qJLAAAAdFwaVgAAAHLJSDAAAEBCRoKzJWEFAAAglySsAAAACUlYsyVhBQAAIJckrAAAAAlJWLMlYQUAACCXNKwAAADkkpFgAACAhIwEZ0vCCgAAQC5JWAEAABKSsGZLwgoAAEAuaVgBAADIJSPBAAAACRkJzpaEFQAAgFySsAIAACQkYc2WhBUAAIBckrACAAAkJGHNloQVAACAXNKwAgAAkEtGggEAABIyEpwtCSsAAAC5JGEFAABISMKaLQkrAAAAuaRhBQAAIJeMBAMAAKTQkUd0syZhBQAAIJckrAAAAAm56FK2JKwAAADkkoYVAACAXDISDAAAkJCR4GxJWAEAAMglCSsAAEBCEtZsSVgBAADIJQkrAABAQhLWbElYAQAAyCUNKwAAQAf17rvvxvjx46OysjJ69uwZ5557bmzevHmH9a+88kqUlJRs9/bAAw8U67b3+H333Zd6f0aCAQAAEmpvI8Hjx4+PdevWxcKFC2Pr1q0xceLEOO+882L+/PnbrR84cGCsW7eu2bHbbrstrr/++jjppJOaHb/zzjtj7Nixxfs9e/ZMvT8NKwAAQBtQV1fX7H55eXmUl5fv8novvvhiLFiwIJ555pkYMWJERETcfPPN8ZWvfCVuuOGGGDBgwDbPKSsri6qqqmbHHnzwwfjqV78ae+65Z7PjPXv23KY2LSPBAAAACX2SsGZ9i/hrutmjR4/ibfbs2bv1WpYuXRo9e/YsNqsREdXV1VFaWhrLli1LtMaKFSti5cqVce65527z2OTJk6NPnz4xcuTIuOOOO3YpKZawAgAAtAFr166NysrK4v3dSVcjImpra6Nv377NjnXq1Cl69+4dtbW1ida4/fbb49BDD41jjz222fGrrroqvvzlL0e3bt3i8ccfjwsuuCA2b94cF154Yao9algBAADagMrKymYN645ceumlce211+605sUXX9zt/Xz44Ycxf/78uPzyy7d57L8eO/roo6O+vj6uv/56DSsAAEBLaQsXXfrud78bZ5999k5r9t9//6iqqooNGzY0O/7xxx/Hu+++m+izp7/4xS/igw8+iLPOOutTa0eNGhUzZ86MhoaGVMmwhhUAAKAd2XvvvWPvvff+1LrRo0fHxo0bY8WKFTF8+PCIiHjiiSeiqakpRo0a9anPv/322+O///f/nuhrrVy5Mnr16pV6jFnDCgAAkFBbSFiTOvTQQ2Ps2LExadKkmDdvXmzdujWmTJkS48aNK14h+I033ogxY8bEPffcEyNHjiw+d/Xq1fHkk0/Gb37zm23W/dWvfhXr16+Pz3/+81FRURELFy6MWbNmxfe+973Ue9SwAgAAdFD33ntvTJkyJcaMGROlpaVx+umnx0033VR8fOvWrbFq1ar44IMPmj3vjjvuiH333TdOPPHEbdbs3LlzzJ07Ny6++OIoFApx4IEHxo033hiTJk1KvT8NKwAAQELtKWGNiOjdu3fMnz9/h48PHjx4u19/1qxZMWvWrO0+Z+zYsTF27NjPZH9+DysAAAC5pGEFAAAgl4wEAwAAJNTeRoLzTsIKAABALklYAQAAEpKwZqvDNKyPP/54dOvWLVHtHXfckXjdBx98MNU+Pvroo8S1nTt3TrV2TU1NqvodXdVre/r165dq7ZdeeilV/bvvvpu49v3330+19uuvv564tqSkJNXa69evT1Wf5hclb9y4MdXaBx98cKr6t956K3FtRUVFqrW3bNmSuLZLly6p1v74449T1adZv6mpKdXanTql+xaa5n82ZWVlqdZOo7S0ZYdr0v456ghrt7S2+r605fecbTmfQEswEgwAAEAudZiEFQAAYHcZCc6WhBUAAIBckrACAAAkJGHNloQVAACA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",
      "text/plain": [
       "<Figure size 1200x800 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "def get_angles(pos, i, d_model):\n",
    "    angle_rates = 1 / np.power(10000, (2 * (i//2)) / np.float32(d_model))\n",
    "    return pos * angle_rates\n",
    "def positional_encoding(position, d_model):\n",
    "    angle_rads = get_angles(np.arange(position)[:, np.newaxis],\n",
    "                          np.arange(d_model)[np.newaxis, :],\n",
    "                          d_model)\n",
    "    # apply sin to even indices in the array; 2i\n",
    "    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])\n",
    "    # apply cos to odd indices in the array; 2i+1\n",
    "    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])\n",
    "    pos_encoding = angle_rads[np.newaxis, ...]\n",
    "    return pos_encoding\n",
    "\n",
    "\n",
    "tokens = 10\n",
    "dimensions = 64\n",
    "pos_encoding = positional_encoding(tokens, dimensions)\n",
    "print (pos_encoding.shape)\n",
    "plt.figure(figsize=(12,8))\n",
    "plt.pcolormesh(pos_encoding[0], cmap='gray')\n",
    "plt.xlabel('维度')\n",
    "plt.xlim((0, dimensions))\n",
    "plt.ylim((tokens,0))\n",
    "plt.ylabel('位置向量')\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
